//package com.gosling.cloudspace.tools;
//
//import com.alibaba.fastjson.JSON;
//import com.alibaba.fastjson.JSONObject;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.data.redis.connection.DefaultStringRedisConnection;
//import org.springframework.data.redis.connection.RedisConnection;
//import org.springframework.data.redis.core.*;
//import org.springframework.stereotype.Component;
//import org.redisson.api.RLock;
//import org.redisson.api.RedissonClient;
//
//import javax.annotation.Resource;
//import java.util.Date;
//import java.util.concurrent.TimeUnit;
//import java.util.concurrent.locks.ReentrantLock;
//
////@Component
//public class RedisTool {
//    protected final Logger logger = LoggerFactory.getLogger(getClass());
//    /**
//     * 默认过期时长，单位：秒
//     */
//    public final static long DEFAULT_EXPIRE = 60 * 60 * 24;
//    /**
//     * 不设置过期时长
//     */
//    public final static long NOT_EXPIRE = -1;
//    @Autowired
//    private RedisTemplate<String, Object> redisTemplate;
//    @Autowired
//    private ValueOperations<String, String> valueOperations;
//    @Autowired
//    private HashOperations<String, String, Object> hashOperations;
//    @Autowired
//    private ListOperations<String, Object> listOperations;
//    @Autowired
//    private SetOperations<String, Object> setOperations;
//    @Autowired
//    private ZSetOperations<String, Object> zSetOperations;
//    @Autowired
//    private DefaultStringRedisConnection redisConnection;
//    @Resource
//    private RedissonClient redissonClient;
//
//    public boolean getLock(String lockId) {
//        Boolean success = redisTemplate.opsForValue().setIfAbsent(lockId, "lock");
//
//        redisTemplate.expire(lockId, 15, TimeUnit.SECONDS);
//        return success != null && success;
//    }
//
//    public void releaseLock(String lockId) {
//        redisTemplate.delete(lockId);
//    }
//
//
//    public void set(String key, Object value, long expire) {
//        valueOperations.set(key, toJson(value));
//        if (expire != NOT_EXPIRE) {
//            redisTemplate.expire(key, expire, TimeUnit.SECONDS);
//
//        }
//    }
//
//    public void set(String key, Object value) {
//        set(key, value, DEFAULT_EXPIRE);
//    }
//
//    public <T> T get(String key, Class<T> clazz, long expire) {
//        String value = valueOperations.get(key);
//        if (expire != NOT_EXPIRE) {
//            redisTemplate.expire(key, expire, TimeUnit.SECONDS);
//        }
//        return value == null ? null : fromJson(value, clazz);
//    }
//
//    public <T> T get(String key, Class<T> clazz) {
//        return get(key, clazz, NOT_EXPIRE);
//    }
//
//    public String get(String key, long expire) {
//        String value = valueOperations.get(key);
//        if (expire != NOT_EXPIRE) {
//            redisTemplate.expire(key, expire, TimeUnit.SECONDS);
//        }
//        return value;
//    }
//
//    public String get(String key) {
//        return get(key, NOT_EXPIRE);
//    }
//
//    public void delete(String key) {
//        redisTemplate.delete(key);
//    }
//
//    /**
//     * Object转成JSON数据
//     */
//    private String toJson(Object object) {
//        if (object instanceof Integer || object instanceof Long || object instanceof Float ||
//                object instanceof Double || object instanceof Boolean || object instanceof String) {
//            return String.valueOf(object);
//        }
//        return JSON.toJSONString(object);
//    }
//
//    /**
//     * JSON数据，转成Object
//     */
//    private <T> T fromJson(String json, Class<T> clazz) {
//        return JSON.parseObject(json, clazz);
//    }
//
//    /**
//     * 查看是否存在 by YHQ
//     */
//    public boolean exists(String key) {
//        return redisTemplate.hasKey(key);
//    }
//
//    public void setDB(String key, Object value, Integer dataBase) {
//        if (null == dataBase) {
//            set(key, value, DEFAULT_EXPIRE);
//        } else {
//            /** 设置dataBase*/
//            redisConnection.select(dataBase);
//            redisConnection.set(key, toJson(value));
//        }
//    }
//
//    public void deleteDB(String key, Integer dataBase) {
//        if (null == dataBase) {
//            redisTemplate.delete(key);
//        } else {
//            /** 设置dataBase*/
//            redisConnection.select(dataBase);
//            redisConnection.del(key);
//        }
//    }
//
//
//    public <T> T getDB(String key, Class<T> clazz, Integer dataBase) {
//        if (null == dataBase) {
//            return get(key, clazz, NOT_EXPIRE);
//        } else {
//            /** 设置dataBase*/
//            redisConnection.select(dataBase);
//            String value = redisConnection.get(key);
//            JSONObject json = JSONObject.parseObject(value);
//            return JSON.toJavaObject(json, clazz);
//        }
//    }
//
//    public String getDB(String key, Integer dataBase) {
//        if (null == dataBase) {
//            String value = valueOperations.get(key);
//            redisTemplate.expire(key, NOT_EXPIRE, TimeUnit.SECONDS);
//            return value;
//        } else {
//            /** 设置dataBase*/
//            RedisConnection connection = redisTemplate.getConnectionFactory().getConnection();
//            DefaultStringRedisConnection stringRedisConnection = new DefaultStringRedisConnection(connection);
//            stringRedisConnection.select(dataBase);
//            return stringRedisConnection.get(key);
//        }
//    }
//
//    /**
//     * 像list队列左边
//     *
//     * @param key    队列key
//     * @param value  要添加的值
//     * @param expire 过期时间（s），传-1无过期时间
//     */
//    public void listLeftPush(String key, String value, long expire) {
//        redisTemplate.opsForList().leftPush(key, value);
//        if (expire != NOT_EXPIRE) {
//            redisTemplate.expire(key, expire, TimeUnit.SECONDS);
//        }
//    }
//
//    /**
//     * 像list队列左边
//     *
//     * @param key    队列key
//     * @param values 要添加的值数组
//     * @param expire 过期时间（s），传-1无过期时间
//     */
//    public void listLeftPushAll(String key, String[] values, long expire) {
//        redisTemplate.opsForList().leftPushAll(key, values);
//        if (expire != NOT_EXPIRE) {
//            redisTemplate.expire(key, expire, TimeUnit.SECONDS);
//        }
//    }
//
//    /**
//     * 移除并获取队列右边第一个值
//     *
//     * @param key 队列key
//     */
//    public String listRightPop(String key) {
//        Object value = redisTemplate.opsForList().rightPop(key);
//        return value != null ? String.valueOf(value) : "";
//    }
//
//    /***
//     * redis分布式锁🔒
//     * 当当前系统拿到Redis锁的时候，其它系统将无法对此锁对象进行操作，为分布式锁
//     * 分布式锁的本质还是Redis的一个普通的key
//     */
//    public void redisSessionLock() {
//        if (this.exists("xxx")) {
//            return;
//        }
//        RLock rLock = redissonClient.getLock("自定义key");
//        try {
//            //尝试获取锁，如果尝试获取锁成功，则加锁也成功
//            boolean tryLock = rLock.tryLock(1L, (1000L * 1000L * 1000L) * 10, TimeUnit.NANOSECONDS);
//            logger.info("尝试获取锁是否成功: " + tryLock);
//            if (!tryLock) {
//                //如果没有获取到锁，说明其它多机部署的其中一台正在执行此操作
//                logger.info("未获取到锁，直接返回");
//                return;
//            }
//        } catch (InterruptedException e) {
//            logger.error("redis分布式锁获取异常：", e);
//        }
//        try {
//            if (this.exists("xxx")) {
//                logger.info("获取到锁后已经有数据，直接返回");
//                return;
//            }
//            //TODO 业务操作
//            String batchNum = "121212121";
//            logger.info("更新保存到数据库：{}", batchNum);
//            this.set("xxx", batchNum, 60 * 2);
//            //添加批次号到批次号队列
//            this.listLeftPush("xxx", batchNum, RedisTool.NOT_EXPIRE);
//            //......
//        } finally {
//            //无论任何锁的解锁都必须放在finally里面进行
//            //rLock.forceUnlock(); 强制解锁
//            //是否处于锁定状态，是否是当前线程加的锁
//            //if (rLock.isLocked() && rLock.isHeldByCurrentThread()) {
//            //    rLock.unlock();
//            //}
//            if (rLock.isLocked()) {
//                //如果处于锁定状态就解锁
//                rLock.unlock();
//            }
//        }
//    }
//
//}
